package calculadorfpa.modelo;

import calculadorfpa.exception.MyFPAException;
import java.util.List;



/**
 * @author TECBMBKD
 * @version 1.0
 * @created 19-jun-2011 14:18:06
 */
public class ProjetoMelhoria extends Projeto {

	private int add;
	private int cfp;
	private int chga;
	private int del;
	private Projeto projetoEmMelhoria;
	public List<Funcao> listaFuncoesAdicionadas;
        public List<Funcao> listaFuncoesAlteradas;
        public List<Funcao> listaFuncoesExcluidas;

	public ProjetoMelhoria(){
               
	}

	public void finalize() throws Throwable {
		super.finalize();
	}

	/**
	 * Recebe como parametro o projeto que esta sofrendo mudan�as
	 * 
	 * @param projetoEmMelhoria
	 */
	public ProjetoMelhoria(Projeto projetoEmMelhoria){            
             this.projetoEmMelhoria = projetoEmMelhoria;
	}

	/**
	 * Somar os valores de complexidade das fun��es da lista 'funcoesAdicionadas'
	 */
	private void calcularAdd(){
            int total = 0;
            for(Funcao f : listaFuncoesAdicionadas) {
                total += f.obterComplexidade();
            }
            setAdd(total);            
	}

	/**
	 * Somar os valores de complexidade das fun��es da lista 'funcoesAlteradas'.
	 */
	private void calcularChga(){
            int total = 0;
            for(Funcao f : listaFuncoesAlteradas) {
                total += f.obterComplexidade();
            }
            setAdd(total);       
	}

	/**
	 * Somar os valores de complexidade das fun��es da lista 'funcoesDeletadas'
	 */
	private void calcularDel(){
            int total = 0;
            for(Funcao f : listaFuncoesExcluidas) {
                total += f.obterComplexidade();
            }
            setAdd(total);   
	}

	/**
	 * Calcular o ponto de fun��o ajustado acordo com a <a href="$element://{83D8642C-
	 * CF8B-438b-99E5-41C4D185004B}"><font color="#0000ff"><u>RN018</u></font></a>. 
	 */
    @Override
	protected void calcularPontoFuncaoAjustado(){
            double pfa = (getPontoFuncaoBruto() * getFatorAjuste()) + (getDel() * projetoEmMelhoria.getFatorAjuste());
            setPontoFuncaoAjustado(pfa);
	}

	/**
	 * Obter os valores de Add, Chga e Del:
	 * 
	 * 1.calcularAdd()
	 * 2.calcularChga()
	 * 3.calcularDel()
	 * 
	 * Ap�s isso, calcular o PFB de acordo com a <a href="$element://{4566A55D-B68B-
	 * 46a2-94D7-95B842BB4E2D}"><font color="#0000ff"><u>RN016</u></font></a>.  
	 */
    @Override
	protected void calcularPontoFuncaoBruto(){
	}

	/**
	 * Executa os seguintes passos:
	 * 
	 * 1. super.calcularProjeto()
	 * 2. definirFuncoes()
	 */
    @Override
	public void calcularProjeto(){
            super.calcularProjeto();
            definirFuncoes();
	}

	/**
	 * Esse metodo tem como objetivo definir quais as sao as fun��es do projeto ap�s a
	 * melhoria:
	 * 
	 * 1. Copiar as funcoes da lista 'funcoes' do 'projetoEmMelhoria' para a lista
	 * 'funcoes' (atributo)
	 * 
	 * 2. Para cada funcao em 'funcoesDeletadas', deletar a funcao correspondente da
	 * lista 'funcoes'
	 * 
	 * 3. Para cada funcaoAlterada em 'funcoesAlteradas', atualizar as informa��es da
	 * funcao correspondente na lista 'funcoes'
	 * 
	 * 4. Para cada funcao em 'funcoesAdicionadas', adicionar a funcao na lista
	 * 'funcoes'
	 */
	private void definirFuncoes(){
            this.listaFuncoes.addAll(projetoEmMelhoria.getListaFuncoes());
            
            this.listaFuncoes.removeAll(this.getListaFuncoesExcluidas());
            
            this.listaFuncoes.removeAll(this.getListaFuncoesAlteradas());
            this.listaFuncoes.addAll(this.getListaFuncoesAlteradas());
            
            this.listaFuncoes.addAll(this.getListaFuncoesAdicionadas());
	}

    public int getAdd() {
        return add;
    }

    public void setAdd(int add) {
        this.add = add;
    }

    public int getCfp() {
        return cfp;
    }

    public void setCfp(int cfp) {
        this.cfp = cfp;
    }

    public int getChga() {
        return chga;
    }

    public void setChga(int chga) {
        this.chga = chga;
    }

    public int getDel() {
        return del;
    }

    public void setDel(int del) {
        this.del = del;
    }

    public List<Funcao> getListaFuncoesAdicionadas() {
        return listaFuncoesAdicionadas;
    }

    public void setListaFuncoesAdicionadas(List<Funcao> listaFuncoesAdicionadas) {
        this.listaFuncoesAdicionadas = listaFuncoesAdicionadas;
    }

    public List<Funcao> getListaFuncoesAlteradas() {
        return listaFuncoesAlteradas;
    }

    public void setListaFuncoesAlteradas(List<Funcao> listaFuncoesAlteradas) {
        this.listaFuncoesAlteradas = listaFuncoesAlteradas;
    }

    public List<Funcao> getListaFuncoesExcluidas() {
        return listaFuncoesExcluidas;
    }

    public void setListaFuncoesExcluidas(List<Funcao> listaFuncoesExcluidas) {
        this.listaFuncoesExcluidas = listaFuncoesExcluidas;
    }

    public Projeto getProjetoEmMelhoria() {
        return projetoEmMelhoria;
    }     
}